home *** CD-ROM | disk | FTP | other *** search
/ Apple II Magazines (DO) / Nibble Volume 09, No. 07 (1988-07)(MicroSPARC)(Side B).zip / Nibble Volume 09, No. 07 (1988-07)(MicroSPARC)(Side B).do / COMPARER.txt < prev    next >
Text File  |  1996-12-24  |  9KB  |  556 lines

  1.  SBTL 'BASIC PROGRAM COMPARER'
  2. *
  3. *  PROGRAM TO COMPARE THE CONTENTS
  4. *   OF TWO APPLESOFT PROGRAM FILES
  5. *
  6. *                   R.B.JORDAN
  7. *                   RUAKURA A.R.C.
  8. *                   NOV 1983
  9. ***********************************
  10.  ORG $8000
  11. *
  12. *   ROUTINES AND POINTERS FOR
  13. *    THE CALLING PROGRAM.
  14. *
  15. *
  16. *    FILE DRIVE NOS. 
  17. *      AT 32768 
  18. *
  19. DRIVE DS 2
  20. *
  21. *    ENTRY POINT
  22. *      AT 32770
  23. *
  24. ENTRY JMP INIT
  25. *
  26. *    ONERR GOTO FIXER
  27. *      AT 32775 
  28. *
  29.  DS 32775-*
  30. *
  31. FIX PLA ;FETCH RETURN ADDRESS
  32.  TAY 
  33.  PLA
  34.  LDX $DF ;GET TRUE STACK PNT
  35.  TXS 
  36.  PHA ;PUT BACK RET ADR
  37.  TYA
  38.  PHA
  39.  RTS ;AND RETURN
  40. *
  41.  PAGE
  42. *
  43. *    TRACK SECTOR AND DATA
  44. *        STORAGE AREAS
  45. *
  46.  DSECT
  47.  ORG $9000
  48. F1TS DS 256
  49. F2TS DS 256
  50. F1LOBL DS 256
  51. F1HIBL DS 256
  52. F2LOBL DS 256
  53. F2HIBL DS 256
  54.  DEND
  55. *
  56. *    SCALARS AND EQUATES
  57. *
  58. F1TSPNT DFB 0 ;CURRENT FILE T/S
  59. F2TSPNT DFB 0 
  60. F1LSTLO DFB 0 ;PREVIOUS EOL POINTERS
  61. F1LSTHI DFB 0
  62. F2LSTLO DFB 0
  63. F2LSTHI DFB 0
  64. F1PNTLO EQU $19 ;POINTERS TO CURRENT LINE
  65. F1PNTHI EQU $1A
  66. F2PNTLO EQU $1B
  67. F2PNTHI EQU $1C
  68. LINLEN1 DFB 0 ;LINE LENGTHS
  69. LINLEN2 DFB 0
  70. PFLAG1 DFB 0 ;IF MINUS PRINT
  71. PFLAG2 DFB 0 ;  THIS LINE
  72. PNTTO EQU $6 ;GENERAL BASEPAGE POINTER
  73. PNTFROM EQU $8
  74. LINPRT EQU $ED24 ;BASIC PRINT A,X 
  75. OUTPUT EQU $DB5C ;BASIC O/P 
  76. CRDO EQU $DAFB ;BASIC CAR. RET. 
  77. FPNT DFB 0
  78. CH EQU $24 ;MONITOR CHAR. HORIZ 
  79. YSAVE DFB 0
  80. TKNTBL EQU $D0D0 ;BASIC TOKEN TABLE 
  81. SETINV EQU $FE80 ;MON. SET INVERSE  
  82. SETNORM EQU $FE84 ;AND NORMAL
  83. CNTRLC EQU $83 ;KEYBOARD STUFF 
  84. KEYBD EQU $C000
  85. KEYSTRB EQU $C010
  86. LPNT DFB 0 ;ADR OF LAST MESSAGE 
  87.  PAGE
  88. *
  89. *    INITIAL PROGRAM ENTRY POINT
  90. *
  91. *    READ BLOCK FROM EACH FILE
  92. *
  93. INIT LDA #$C ;SET T/S POINTER
  94.  STA F1TSPNT
  95.  STA F2TSPNT
  96.  LDA #0
  97.  JSR READTS
  98.  LDA #1
  99.  JSR READTS
  100. *    INITIALIZE DATA POINTERS
  101. *
  102.  LDA #0 ;CLEAR ADR OF  
  103.  STA LPNT ;LAST MESSAGE
  104.  LDA #1 ;PREVIOUS NEXT LINE
  105.  STA F1LSTLO ;  POINTERS $801 
  106.  STA F2LSTLO
  107.  LDA #8
  108.  STA F1LSTHI
  109.  STA F2LSTHI
  110. *
  111.  LDA #2 ;DATA POINTERS TO 3RD 
  112.  STA F1PNTLO ;BYTE OF FILE 
  113.  STA F2PNTLO
  114.  LDA #<F1HIBL
  115.  STA F1PNTHI
  116.  LDA #<F2HIBL
  117.  STA F2PNTHI
  118. *
  119.  LDY #0 ;COMPUTE 
  120.  LDA (F1PNTLO),Y ;FIRST LINE LENGTHS
  121.  STA LINLEN1
  122.  DEC LINLEN1
  123.  LDA (F2PNTLO),Y
  124.  STA LINLEN2
  125.  DEC LINLEN2
  126.  PAGE
  127. *
  128. *    MAIN LOOP STARTS HERE
  129. *
  130. *    CHECK FOR END OF FILE1
  131. *
  132. MAIN LDY #0
  133.  LDA (F1PNTLO),Y ;CHECK LINE POINTER 
  134.  CMP #0 ;FOR ZERO 
  135.  BNE NOTEOF1 ;IN BOTH BYTES
  136.  INY
  137.  CMP (F1PNTLO),Y
  138.  BNE NOTEOF1
  139. *
  140. *    EOF - PRINT F2 LINE
  141. *
  142.  LDA #$80
  143.  STA PFLAG2
  144.  JMP CHF2
  145. *
  146. *    DOES F1 LINE START IN HIBLOCK?
  147. *
  148. NOTEOF1 LDA #0
  149.  STA PFLAG2
  150.  LDA F1PNTHI
  151.  CMP #<F1HIBL
  152.  BNE CHF2 ;STILL IN LOBLOCK!
  153.  LDA #0 ;IN HIBLOCK PUSH
  154.  JSR READTS ;  DOWN & READ
  155. *
  156. *    CHECK FOR END OF FILE 2
  157. *
  158. CHF2 LDY #0
  159.  LDA (F2PNTLO),Y ;CHECK LINE POINTER 
  160.  CMP #0 ;FOR ZERO 
  161.  BNE NOTEOF2 ;IN BOTH BYTES
  162.  INY
  163.  CMP (F2PNTLO),Y
  164.  BNE NOTEOF2 
  165. *  
  166. *    EOF - PRINT F1 LINE
  167.  LDA #$80
  168.  STA PFLAG1 
  169.  JMP EOJOBCK 
  170. *
  171. *    DOES F2 LINE START IN HIBLOCK?
  172. *
  173. NOTEOF2 LDA #0
  174.  STA PFLAG1 
  175.  LDA F2PNTHI
  176.  CMP #<F2HIBL
  177.  BNE EOJOBCK ;STILL IN LOBLOCK!
  178.  LDA #1 ;IN HIBLOCK PUSH
  179.  JSR READTS ;  DOWN & READ
  180.  PAGE
  181. *
  182. *    IF BOTH FILES AT EOF - END OF JOB
  183. *
  184. EOJOBCK LDA KEYBD ;CHECK FOR CNTRL-C 
  185.  CMP #CNTRLC  
  186.  BEQ WINDUP ;OPS HAD ENOUGH
  187.  LDA PFLAG1
  188.  AND PFLAG2
  189.  BPL NOTBOTH
  190. *
  191. *    END OF COMPARISON
  192. *
  193. WINDUP BIT KEYSTRB ;KILL KEYBOARD
  194.  LDA #MESS5 ;SELECT FINISH TEXT
  195.  JSR MESSOUT 
  196.  RTS
  197. *
  198. *    IF ONLY ONE AT EOF LIST OTHER 
  199. *
  200. NOTBOTH LDA PFLAG1
  201.  ORA PFLAG2
  202.  BMI LIST
  203. *
  204. *    ARE LINE NOS. EQUAL?
  205. *
  206.  LDY #3
  207.  LDA (F1PNTLO),Y ;HIBYTE CHK
  208.  CMP (F2PNTLO),Y 
  209.  BCC LESS ;F1 < F2
  210.  BNE GREATER ;F1 > F2
  211.  DEY ;NOT SURE YET
  212.  LDA (F1PNTLO),Y ;LOBYTE CHK
  213.  CMP (F2PNTLO),Y 
  214.  BCC LESS
  215.  BEQ EQUAL
  216. *
  217. *    NOT EQUAL SET APPROP. FLAGS
  218. *
  219. GREATER LDA #$80
  220.  BNE SETFLGS
  221. LESS LDA #$0
  222. *
  223. SETFLGS STA PFLAG2
  224.  EOR #$80
  225.  STA PFLAG1
  226.  JMP LIST
  227.  PAGE
  228. *
  229. *    LINE NUMBERS EQUAL. CHECK LENGTHS
  230. *
  231. EQUAL LDA LINLEN1
  232.  CMP LINLEN2
  233.  BNE DIFFRNT
  234. *
  235. *    SAME LENGTH. CHECK CONTENTS
  236. *
  237.  LDY #4
  238. MATLOOP LDA (F1PNTLO),Y
  239.  CMP (F2PNTLO),Y
  240.  BNE DIFFRNT
  241.  INY
  242.  CPY LINLEN1
  243.  BNE MATLOOP
  244. *
  245. *    LINES THE SAME-SET FLAGS & SKIP 
  246. *
  247.  LDA #$80
  248.  STA PFLAG1
  249.  STA PFLAG2
  250.  JMP SKIP
  251. *
  252. *    LINES DIFFERENT-SET FLAGS & LIST 
  253. *
  254. DIFFRNT LDA #$80
  255.  STA PFLAG1
  256.  STA PFLAG2
  257. *
  258. *    LIST LINES IF THEIR PFLAG IS TRUE
  259. *
  260. LIST BIT PFLAG1
  261.  BPL LIST2
  262.  LDY #F1PNTLO ;SELECT F1 LINE 
  263.  LDA #MESS1 ;SET 'CHANGED'MESG 
  264.  BIT PFLAG2
  265.  BMI *+4 
  266.  LDA #MESS2 ;SET 'DELETED'MESG
  267.  JSR LISTLIN ;LIST IT
  268. *
  269. *    SAME FOR LINE2
  270. *
  271. LIST2 BIT PFLAG2 
  272.  BPL SKIP
  273.  LDY #F2PNTLO ;SELECT F2 LINE 
  274.  LDA #MESS3 ;SET 'TO'MESG
  275.  BIT PFLAG1
  276.  BMI *+4 
  277.  LDA #MESS4 ;SET 'ADDED'MESG
  278.  JSR LISTLIN ;LIST IT
  279.  PAGE
  280. *    SKIP LINES IF NECESSARY
  281. *
  282. SKIP BIT PFLAG1 ;SKIP LINE IN F1?
  283.  BPL SKIP2
  284.  LDY #0
  285.  LDA (F1PNTLO),Y ;SAVE START ADR OF 
  286.  STA F1LSTLO ; NEXT LINE
  287.  INY
  288.  LDA (F1PNTLO),Y
  289.  STA F1LSTHI
  290. *
  291.  LDA LINLEN1 ;ADVANCE LINE POINTER
  292.  CLC ; TO START OF NEXT 
  293.  ADC F1PNTLO
  294.  STA F1PNTLO
  295.  LDA #0
  296.  ADC F1PNTHI
  297.  STA F1PNTHI
  298. *
  299.  LDY #0 ;RECOMPUTE LINE LENGTHS
  300.  LDA (F1PNTLO),Y
  301.  SEC
  302.  SBC F1LSTLO
  303.  STA LINLEN1
  304. *    SKIP PROCESS FOR LINE2
  305. *
  306. SKIP2 BIT PFLAG2 ;SKIP LINE IN F2?
  307.  BPL ALLDUN 
  308.  LDY #0
  309.  LDA (F2PNTLO),Y ;SAVE START ADR OF 
  310.  STA F2LSTLO ; NEXT LINE
  311.  INY
  312.  LDA (F2PNTLO),Y
  313.  STA F2LSTHI
  314. *
  315.  LDA LINLEN2 ;ADVANCE LINE POINTER
  316.  CLC ; TO START OF NEXT 
  317.  ADC F2PNTLO
  318.  STA F2PNTLO
  319.  LDA #0
  320.  ADC F2PNTHI
  321.  STA F2PNTHI
  322. *
  323.  LDY #0 ;RECOMPUTE LINE LENGTHS
  324.  LDA (F2PNTLO),Y
  325.  SEC
  326.  SBC F2LSTLO
  327.  STA LINLEN2 
  328. *
  329. *    END OF MAIN LOOP
  330. *
  331. ALLDUN JMP MAIN ;CONTINUE COMPARE 
  332.  PAGE
  333. *
  334. *    DOS RWTS COMMUNICATION
  335. *
  336. RWTS EQU $3D9
  337. IB DFB 1
  338. IBSLT DFB $60
  339. IBDRV DFB 1
  340. IBVOL DFB 0
  341. IBTRK DFB 0
  342. IBSECT DFB 0
  343. IBDCT DW DCT
  344. IBBUF DW 0
  345.  DW 0
  346. IBCMD DFB 1
  347. IBSTAT DFB 0
  348.  DFB 0
  349.  DFB $60
  350.  DFB 1
  351. *
  352. DCT DFB 0
  353.  DFB 1
  354.  DFB $EF
  355.  DFB $D8
  356. *
  357. *    MOVE BUFFER DOWN ONE PAGE
  358. *
  359. READTS STA FPNT ;FILE ARG
  360.  ASL A
  361.  TAX
  362.  CLC ;COMPUTE ADR OF 
  363.  ADC #<F1LOBL ;LOWER BLOCK
  364.  STA PNTTO+1
  365.  CLC
  366.  ADC #1 ;AND HI BLOCK
  367.  STA PNTFROM+1
  368.  LDA #0
  369.  STA PNTTO
  370.  STA PNTFROM ;LO ADRS =0
  371. *
  372.  TAY
  373. MOVE LDA (PNTFROM),Y
  374.  STA (PNTTO),Y ;MOVE IT DOWN
  375.  INY
  376.  BNE MOVE
  377. *
  378.  DEC F1PNTHI,X ;DECREMENT POINTER 
  379.  PAGE
  380. *
  381. *    READ A TRACK SECTOR 
  382. *
  383.  LDA PNTFROM+1 ;SET RWTS TO HIBLOCK 
  384.  STA IBBUF+1
  385.  LDA #0
  386.  STA IBBUF
  387. *
  388.  LDX FPNT ; SET DRIVE
  389.  LDA DRIVE,X
  390.  STA IBDRV
  391. *
  392.  TXA ;FIND NEW TRK / SECT 
  393.  CLC
  394.  ADC #<F1TS
  395.  STA PNTTO+1 
  396. *
  397.  LDY F1TSPNT,X ;GET TRACK
  398.  LDA (PNTTO),Y
  399.  STA IBTRK
  400.  BEQ RWOK ;IF END OF T/S'S DON'T
  401.  INY
  402.  LDA (PNTTO),Y ;GET SECT
  403.  STA IBSECT
  404.  INY
  405.  TYA
  406.  STA F1TSPNT,X ;UPDATE T/S PNTR
  407. *
  408.  LDA #<IB
  409.  LDY #>IB
  410.  JSR RWTS ;DO THE READ T/S
  411.  BCS ERREXIT ;IT KERASHED
  412. RWOK RTS
  413. *
  414. ERREXIT PLA
  415.  PLA ;POP SUB ADR
  416.  LDA #MESS6
  417.  JSR MESSOUT ;PRINT ERROR MESS
  418.  RTS
  419.  PAGE
  420. *
  421. *   SUBROUTINE TO PRINT MESSAGE AND 
  422. *    LIST LINE IF REQUIRED
  423. *
  424. *
  425. *     MESSAGE OUTPUT 
  426. *
  427. MESSOUT JSR SETINV ;INVERSE VIDEO 
  428.  TAY
  429. OUTLOOP LDA BASE,Y ;GET CHAR.
  430.  CMP #0 ;END OF MESSAGE?
  431.  BEQ DONE ;YES!
  432.  JSR OUTPUT ;NO - PRINT CHAR
  433.  INY ;NO! ADVANCE POINTER
  434.  BNE OUTLOOP ;BRANCH ALWAYS 
  435. DONE JSR SETNORM ;NORMAL VIDEO 
  436.  JSR CRDO ;NEW LINE
  437.  RTS
  438. *
  439. *    LINE OUTPUT
  440. *
  441. LISTLIN LDX 0,Y ;SAVE LINE ADR
  442.  STX PNTTO
  443.  LDX 1,Y
  444.  STX PNTTO+1
  445.  CMP LPNT ; SAME AS LAST MESS?
  446.  BEQ LISTIT
  447.  STA LPNT ;SAVE MESS ADR
  448.  JSR MESSOUT
  449. *
  450. LISTIT LDY #2
  451.  LDA (PNTTO),Y
  452.  TAX ;X=LINENO LO
  453.  INY
  454.  LDA (PNTTO),Y ;A=LINENO HI
  455.  STY YSAVE
  456.  JSR LINPRT ;PRINT LINENO
  457.  LDA #'  
  458. LSTLOOP LDY YSAVE
  459. PRCHR JSR OUTPUT ;PRINT NONTOKEN
  460.  LDA CH
  461.  CMP #33 ;BEYOND COL 33?
  462.  BCC NOCR
  463.  JSR CRDO ;YES-PRINT CR
  464.  LDA #5
  465.  STA CH ;SPACE IN 5
  466. NOCR INY
  467.  LDA (PNTTO),Y ;GET NEXT CHAR
  468.  BMI TOKEN ;A TOKEN!
  469.  BNE PRCHR ;NOT END OF LINE
  470. *
  471.  JSR CRDO ;END OF LINE!
  472.  RTS ;AND BACK TO CALLER
  473.  PAGE
  474. *
  475. *    IT'S A TOKEN - FIND IT
  476. *      IN TOKEN TABLE
  477. *
  478. TOKEN SEC ;TOKEN-$7F IS TOKEN 
  479.  SBC #$7F ;  NUMBER +1
  480.  TAX
  481.  STY YSAVE
  482.  LDY #<TKNTBL-$100 ;SET PNTR TO 
  483.  STY PNTFROM+1 ;  TOKEN TABLE-$100
  484.  LDY #>TKNTBL
  485.  STY PNTFROM
  486.  LDY #$FF ;TAB INDEX =$100-1
  487. NXKEY DEX ;DECREMENT TOKEN NO. 
  488.  BEQ PRKEY ;IF 0 FOUND TOKEN
  489. NX1 JSR KEYCHR ;GET NEXT CHAR
  490.  BPL NX1 ;NOT END OF TOKEN
  491.  BMI NXKEY ;END OF TOKEN
  492. *
  493. *    PRINT KEYWORD
  494. *
  495. PRKEY LDA #'  ;BLANK BEFORE TOKEN
  496.  JSR OUTPUT 
  497. PR1 JSR KEYCHR ;GET TOKEN
  498.  BMI PR2 ;LAST?
  499.  JSR OUTPUT ;NO - PRINTIT
  500.  BNE PR1
  501. PR2 JSR OUTPUT ;PRINT LAST
  502.  LDA #'  ;BLANK AFTER TOKEN
  503.  BNE LSTLOOP ;CONTINUE PRINT
  504. *
  505. *    GET CHAR FROM TOKENTABLE
  506. *
  507. KEYCHR INY ;MOVE TO NEXT
  508.  BNE KEY1
  509.  INC PNTFROM+1 ;BUMP HIBYTE
  510. KEY1 LDA (PNTFROM),Y ;GET CHAR
  511.  RTS
  512.  PAGE
  513. *
  514. *    TABLE OF MESSAGES
  515. *
  516. *
  517. *    PRINT LINE OF PROGRAM 1
  518. *
  519. MESS1 DFB $8D
  520.  ASC 'CHANGED'
  521.  DFB $00
  522. *
  523. MESS2 DFB $8D
  524.  ASC 'DELETED'
  525.  DFB $00
  526. *
  527. *    PRINT LINE OF PROGRAM2
  528. *
  529. MESS3 ASC 'TO'
  530.  DFB $00
  531. *
  532. MESS4 DFB $8D
  533.  ASC 'ADDED'
  534.  DFB $00
  535. *
  536. *    NORMAL WINDUP
  537. *
  538. MESS5 DFB $8D
  539.  ASC 'END OF FILES'
  540.  DFB $8D,$00
  541. *
  542. *    ERROR WINDUP
  543. *
  544. MESS6 DFB $8D
  545.  ASC 'I/O ERROR'
  546.  DFB $8D,$00
  547. *
  548. BASE EQU DRIVE+$200
  549. *
  550. *  END
  551. *
  552.